package com.example.date;

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Arrays;
import java.util.List;

/**
 * @author hej
 * @date 2025/1/9 15:24
 */
public class CheckSeq {
    /*
        0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  G  H  J  K  L  M  N  P  Q  R  S  T  U  V  W  X  Y  Z
        0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
        根据提供的SN编码， 获取校验码
        示例编码：AXA53450001ABCDA
        步骤1，将sn编码拆分成字符，从右往左标记位数，首位是奇数，0=奇数字符，E=偶数字符。
        步骤2，所有奇数字符的总和（由34进制转为10进制后求和）乘以3为...216。
        步骤3，所有偶数字符值的和（由34进制转为10进制后求和）为…53。
        步骤4，步骤2和3的总和269。
        步骤5，269除以34后的余数为31[269-238=31]。
        步骤6，34-31=3的结果，校验和为…3。
        完整的17个字符序列号是.AXA53450001ABCDA3。
     */
    public static void main(String[] args) {
        String[] sns = {"AXA53450001ABCDA","C039312HS01D00FA"};
        convertToBase34(Arrays.asList(sns));
    }


    public static void convertToBase34(List<String> sns) {
        String rule = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ";
        System.out.println(rule.indexOf("A"));

        //定义奇偶标识， 奇数和，偶数和， 总和， 临时变量
        for(int y = 0; y < sns.size(); y++) {
            String sn = sns.get(y);
            int number = 1, odd = 0, even = 0, total = 0, temp;
            for (int i = sn.length(); i > 0; i--) {
                temp = rule.indexOf(sn.charAt(i - 1));
                //做个判断，避免加入负数
                temp = temp < 0 ? 0 : temp;
                if (number % 2 == 1) {
                    odd += temp;
                } else {
                    even += temp;
                }
                number++;
            }
            //求总和： 奇数和 * 3 + 偶数和
            total = odd * 3 + even;
            //求最终校验结果： 34 - （总和 % 34）， 转换为34进制
            int checkDigitIndex = total % 34 == 0 ? 0 : 34 - (total % 34);
            sn += rule.charAt(checkDigitIndex);
            sns.set(y, sn);
            System.out.println(sn);
        }
    }
}
